﻿using PatientManagement.Managers;
using PatientManagement.Common.Utils;
using System;
using System.Windows.Forms;
using PatientManagement.Common.ObjectModels;
using System.Collections.Generic;
using System.Threading;

namespace PatientManagement
{
    public partial class FormDrugManagement : Form
    {
        private bool m_HasAddDrug;

        public FormDrugManagement()
        {
            InitializeComponent();
            ShowAllDrugs();
            m_HasAddDrug = false;
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            var form = new FormAddDrug();
            form.ShowDialog();

            if (form.NewDrug != null)
            {
                form.NewDrug.Map(item => dgvResult.Rows.Add(item.Id, item.Name, item.Amount,
                    item.Price, item.Effect, item.AlertAmount));
                m_HasAddDrug = true;
            }
        }

        private void btnSearch_Click(object sender, EventArgs e)
        {
            string query = (cbIsLessThan.Checked == true) ? tbQuantity.Text.Trim() : tbDrugName.Text.Trim();

            if (string.IsNullOrEmpty(query))
            {
                MessageBox.Show("Nhập tên thuốc để tìm kiếm");
            }

            try
            {
                var drugs = new List<Drug>();
                if (cbIsLessThan.Checked == false)
                {
                    drugs = ServiceManager.Instance.SearchDrugByName(query);
                }
                else
                {
                    drugs = ServiceManager.Instance.SearchDrugByQuantity(Decimal.Parse(query));
                }

                if (drugs.Count == 0)
                {
                    MessageBox.Show("Không tìm thấy kết quả nào!");
                }
                else
                {
                    ResetDataGridView();
                    drugs.Map(item => dgvResult.Rows.Add(item.Id, item.Name, item.Amount, Convert.ToInt64(item.Price), item.Effect, item.AlertAmount));
                }
            }
            catch (Exception)
            {
                patientManagementError.SetError(tbQuantity, "Số lượng thuốc không đúng");
            }
        }

        private void dgvResult_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == dgvResult.Columns["colDelete"].Index)
            {
                if (MessageBox.Show("Bạn có chắc chắn muốn xóa?", "Cảnh báo!", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    var row = dgvResult.Rows[e.RowIndex];
                    var id = (int)row.Cells[0].Value;
                    bool isDeleted = ServiceManager.Instance.RemoveDrug(id);
                    if (isDeleted)
                    {
                        dgvResult.Rows.RemoveAt(e.RowIndex);
                    }
                    else
                    {
                        MessageBox.Show("Xóa không thành công");
                    }
                }
            }
            else if (e.ColumnIndex == dgvResult.Columns["colUpdate"].Index)
            {
                var row = dgvResult.Rows[e.RowIndex];
                decimal? alertAmount = null;
                if (row.Cells["colWarningQuantity"].Value != null)
                {
                    alertAmount = Decimal.Parse(row.Cells["colWarningQuantity"].Value.ToString());
                }
                var drug = new Drug()
                {
                    Id = Int16.Parse(row.Cells[0].Value.ToString()),
                    Name = row.Cells[1].Value.ToString(),
                    Amount = Decimal.Parse(row.Cells[2].Value.ToString()),
                    Price = Decimal.Parse(row.Cells[3].Value.ToString()),
                    Effect = row.Cells[4].Value.ToString(),
                    AlertAmount = alertAmount
                };
                bool isUpdated = ServiceManager.Instance.UpdateDrug(drug);
                if (isUpdated)
                {
                    MessageBox.Show("Cập nhật thành công");
                }
                else
                {
                    MessageBox.Show("Cập nhật không thành công");
                }
            }
        }

        private void cbIsLessThan_CheckedChanged(object sender, EventArgs e)
        {
            if (cbIsLessThan.Checked == true)
            {
                tbDrugName.Enabled = false;
                tbQuantity.Enabled = true;
            }
            else
            {
                tbDrugName.Enabled = true;
                tbQuantity.Enabled = false;
            }
        }

        private void ShowAllDrugs()
        {
            var drugs = ServiceManager.Instance.GetAllGrugs();
            drugs.Map(item => dgvResult.Rows.Add(item.Id, item.Name, item.Amount, Convert.ToInt64(item.Price), item.Effect, item.AlertAmount));
        }

        private void ShowAlertDrug()
        {
            for (int i = 0; i < dgvResult.Rows.Count; i++)
            {
                if (dgvResult.Rows[i].Cells["colWarningQuantity"].Value != null &&
                    (Convert.ToDecimal(dgvResult.Rows[i].Cells["colAmount"].Value) <= Convert.ToDecimal(dgvResult.Rows[i].Cells["colWarningQuantity"].Value)))
                {
                    dgvResult.Rows[i].Selected = true;
                }
            }

            if (dgvResult.Rows.Count > 1)
            {
                dgvResult.CurrentCell.Selected = false;
            }
        }

        private void btnViewAllDrugs_Click(object sender, EventArgs e)
        {
            ResetDataGridView();
            ShowAllDrugs();
            ShowAlertDrug();
            
        }

        private void ResetDataGridView()
        {
            dgvResult.Rows.Clear();
        }

        private void FormDrugManagement_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (m_HasAddDrug)
            {
                MessageBox.Show("Bạn cần khởi động lại chương trình để cập nhập lại số thuốc vừa thêm!", "Thông báo", MessageBoxButtons.OK);
            }
        }

        private void FormDrugManagement_Load(object sender, EventArgs e)
        {
            ShowAlertDrug();
        }
    }
}
